#ifndef SINGLETON_H
#define SINGLETON_H
#include <global.h>

/******************************************************************************
 *
 * @file       singleton.h
 * @brief      模板单例类
 *
 * @author     kiyose
 * @date       2024/08/01
 * @history
 *****************************************************************************/
/**
 * @brief Singleton 模板类实现。
 *
 * 此类实现了线程安全的单例模式，确保在整个程序运行期间，
 * 只有一个实例存在，且该实例可以被安全地共享和访问。
 *
 * @tparam T 模板参数，表示单例类的具体类型。
 */
template <typename T>
class Singleton{
protected:
    Singleton() = default;
    Singleton(const Singleton<T>&) = delete;
    Singleton& operator = (const Singleton<T>& st) = delete;
    static std::shared_ptr<T> _instance;
public:
    static std::shared_ptr<T> GetInstance(){
        static std::once_flag s_flag;
        std::call_once(s_flag,[&](){
            _instance = std::shared_ptr<T>(new T);
        });

        return _instance;
    }

    void PrintAddress(){
        std::cout << _instance.get() << std::endl;
    }
    ~Singleton(){
        std::cout<<"this is singleton destruct" <<std::endl;
    }
};

template <typename T>
std::shared_ptr<T> Singleton<T>::_instance = nullptr;
#endif // SINGLETON_H
